----- 串口刷新 -----


该模块为配置、I/O 操作以及获取和设置 RS-232 引脚的控制信号提供了基本功能。
https://doc.qt.io/qt-6/zh/qtquick-positioning-anchors.html

 配置文件 
CMakeLists.txt
find_package(Qt6 COMPONENTS SerialBus REQUIRED)
target_link_libraries(switchUnit PRIVATE Qt6::SerialBus)


 刷新串口 
/*--------------------widget.h --------------------*/
#include <QSerialPortInfo>
 
void updateSerialPortsList();
 
/*--------------------widget.cpp --------------------*/
//封装成函数
void Widget::updateSerialPortsList()
{
    ui->comboBox_COM->clear();  //刷新前先清除下拉菜单
    const auto serialPorts = QSerialPortInfo::availablePorts();  //可用端口
 
    //查找串口
    for (const QSerialPortInfo &portInfo : serialPorts) {  //???
        QString portDescription = portInfo.portName();//???
        if (!portInfo.description().isEmpty()) {//???
            portDescription += " (" + portInfo.description() + ")";//???
        }
 
        //将找到的串口添加到下拉菜单
        ui->comboBox_COM->addItem(portDescription, portInfo.portName());
    }
 
    //输出串口数量
    if (ui->comboBox_COM->count() > 0) {  //启用
        ui->label->setText("找到 " + QString::number(ui->comboBox_COM->count()) + " 个串口");
    } else {
        ui->label->setText("未找到串口 😰");
    }
}



官方文档
链接: https://doc.qt.io/qt-6/qserialportinfo.html
const auto serialPortInfos = QSerialPortInfo::availablePorts();  //???
for (const QSerialPortInfo &portInfo : serialPortInfos) {  //???
    qDebug() << "\n"  //???
                      << "Port:" << portInfo.portName() << "\n"  //???
                      << "Location:" << portInfo.systemLocation() << "\n"  //???
                      << "Description:" << portInfo.description() << "\n"  //???
                      << "Manufacturer:" << portInfo.manufacturer() << "\n"  //???
                      << "Serial number:" << portInfo.serialNumber() << "\n"  //???
                      << "Vendor Identifier:"  //???
                      << (portInfo.hasVendorIdentifier()  //???
                          ? QByteArray::number(portInfo.vendorIdentifier(), 16)  //???
                          : QByteArray()) << "\n"  //???
                      << "Product Identifier:"  //???
                      << (portInfo.hasProductIdentifier()  //???
                          ? QByteArray::number(portInfo.productIdentifier(), 16)  //???
                          : QByteArray());  //???
}



----- 连接设备 -----


/*--------------------widget.h --------------------*/
#include <QMessageBox>
#include <QModbusRtuSerialMaster>
 
void fn_connect();  //连接函数
QModbusRtuSerialClient *RTU_Device = nullptr;  //对应#include < QModbusRtuSerialMaster>
int connectSign = 0;  //连接信号,判断连接按钮显示“断开”或“连接”
 
/*--------------------widget.cpp --------------------*/
void Widget::fn_connect()
{
    RTU_Device = new QModbusRtuSerialClient(this);  //建立主站
    QString COM = ui->comboBox_COM->currentData().toString();  //读取当前选中项关联的数据
 
    //配置串口参数
    RTU_Device->setConnectionParameter (QModbusDevice::SerialPortNameParameter, COM);
    RTU_Device->setConnectionParameter (QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600); 
    RTU_Device->setConnectionParameter (QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
    RTU_Device->setConnectionParameter (QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
    RTU_Device->setConnectionParameter (QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
 
    //连接成功信号
    connect(RTU_Device, &QModbusClient::stateChanged, this, [=](QModbusDevice::State state)
        {
            if (state == QModbusDevice::ConnectedState){
                qDebug() << "Modbus RTU 连接成功!";
            } else if (state == QModbusDevice::ConnectingState) {
                qDebug() << "正在建立Modbus RTU 连接 . . .";
            } else if (state == QModbusDevice::ClosingState) {
                qDebug() << "Modbus RTU 连接正在关闭 . . .";
            } else if (state == QModbusDevice::UnconnectedState) {
                qDebug() << "Modbus RTU 连接已断开";
            }
        }
     );
}
 
//连接按钮(弹窗提示)
void Widget::on_pushButton_connect_clicked()
{
    if (connectSign == 0){
        fn_connect();
        bool connected = RTU_Device->connectDevice();
        if (connected){
            ui->pushButton_connect->setText("断开");
            connectSign = 1;
        }else{
            QMessageBox::critical(this, "错误", "无法打开串口: " + RTU_Device->errorString());
        }
    }else{
        RTU_Device->disconnectDevice();
        ui->pushButton_connect->setText("连接");
        connectSign = 0;
    }
}